// 测试priority_queue
// 底层由vector+堆构成
// 行为类似堆
#include <functional>
#include <iostream>
#include <queue> //priority_queue的头文件
#include <vector>

int main()
{
    // 一.顶部为最大值的priority_queue(大顶堆)
    std::cout << "--------------大顶堆------------" << std::endl;
    std::priority_queue<int> pri_queue1;
    // 向堆中插入元素
    pri_queue1.push(1);
    pri_queue1.push(2);
    pri_queue1.push(3);
    pri_queue1.push(4);
    // 获取堆顶最值
    // 获取size
    for (int i = 0; i < pri_queue1.size(); i++)
    {
        std::cout << pri_queue1.top() << " ";
    }
    std::cout << std::endl;
    // 获取堆顶最值
    // 删除堆顶元素
    // 判断queue为空
    while (!pri_queue1.empty())
    {
        std::cout << pri_queue1.top() << " ";
        pri_queue1.pop();
    }
    std::cout << std::endl;
    // 二.顶部为最小值的priority_queue(小顶堆)
    std::cout << "--------------小顶堆------------" << std::endl;
    // std::greater<int>为小顶堆
    // 记忆：小顶堆的小 与 greater<int>的greater 互为反义词
    std::priority_queue<int, std::vector<int>, std::greater<int> > pri_queue2;
    // 向堆插入元素
    pri_queue2.push(4);
    pri_queue2.push(3);
    pri_queue2.push(2);
    pri_queue2.push(1);
    // 获取堆顶元素
    // 获取堆size
    for (int i = 0; i < pri_queue2.size(); i++)
    {
        std::cout << pri_queue2.top() << " ";
    }
    std::cout << std::endl;
    // 删除堆顶元素
    // 获取堆顶元素
    // 判断堆是否为空
    while (!pri_queue2.empty())
    {
        std::cout << pri_queue2.top() << " ";
        pri_queue2.pop();
    }
    std::cout << std::endl;
    return 0;
}
